﻿using System;
using System.Collections.Generic;
using System.Web.UI;
using KamLib;


namespace Ext.Net.UIS
{

    /// <summary>
    /// Фабрика. Создаёт реальные компоненты на основании поля из бизнес-модели.
    /// </summary>
    public abstract class TermEditor
    {

        #region Types

        public class List : List<TermEditor> { }
        public class Dictionary : SortedDictionary<string, TermEditor> { }

        #endregion


        #region Register

        public static void RegisterStandartEditors()
        {
            FormRegister("row", FieldRowEditor.Default);
            FormRegister("fieldset", FieldSetEditor.Default);
            FormRegister("fieldset2", FieldSetEditor.Default2);

            FormRegister("text", TextFieldEditor.Default);
            FormRegister("int", TextFieldEditor.Default);
            FormRegister("float", TextFieldEditor.Default);
            FormRegister("bool", BoolFieldEditor.Default);
        }


        public readonly static Dictionary FormEditors = new Dictionary();

        public static void FormRegister(string name, TermEditor editor)
        {
            FormEditors[name] = editor;
        }

        public static TermEditor FormGet(string name)
        {
            if (name == "null") return null;

            TermEditor o;
            if (!FormEditors.TryGetValue(name, out o))
                throw new Exception("UisFieldEditor.Get: Can't find term editor '" + name + "'");
            return o;
        }

        #endregion


        public override string ToString()
        {
            return GetType().Name.Replace("Editor", null);
        }


        //public virtual bool HideChildTitles(TermNode node) { return false; }

        /// <summary>
        /// Создаёт компоненты на основании node
        /// </summary>
        /// <returns></returns>
        public abstract IEnumerable<AbstractComponent> NewControls(TermNode node, UisCreateControlArgs e);

        /// <summary>
        /// Показывает, должент ли данный Editor поглощать указанный. 
        /// На случай, если создаваемые controls в указанном editor уже созданны данным. 
        /// Например, данный Editor уже создал FieldContainer, и нет смысла создавать внутри него ещё один.
        /// </summary>
        /// <param name="parent"></param>
        /// <returns></returns>
        public virtual bool MustMerge(TermNode parent) { return false; }

        /// <summary>
        /// Вызывается при построении дерева TermNodes при формировании FieldBox.
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="child"></param>
        public virtual void BeforeAddTermNodeItem(TermNode parent, ref TermNode child) { }

    }

}
